# FontForge のプラグイン

FontForge は、機能を拡張するためにプラグインの機構を提供しています。

プラグインは実行時に読み込むことができる共有ライブラリの形式です。FontForge の起動時 (正確には、環境設定の読み込み時)、以下の 2 つのディレクトリに含まれる、共有ライブラリと思われるファイルをすべて読み込みます。

- `/usr/local/share/fontforge/plugins`
  (より正確には: `$(PREFIX)/share/fontforge/plugins`)
- `~/.PfaEdit/plugins`

## サンプルプラグインのインストール方法

現在、バイナリパッケージにはプラグインは含まれていません。プラグインで遊びたい方は ソース配布を入手して構築し、インストールする必要があります。それを行うには、以下のように入力してください:

>     $ cd plugins
>     $ make install

## あなた自身のプラグインの作成方法

現在 FontForge は以下の 2 つのタイプのプラグインをサポートしています:

- 2 バイト符号化方式を追加するプラグイン
- スクリプトコマンドを追加するプラグイン

(実際には 3 番目のタイプのプラグインが存在すると思います。プラグインを呼び出した時、FF は初期化ルーチンを呼び出します。プラグインが実行を続け、FontForge に戻りもせずに仕事を行ってしまうことは可能だと思います)。

追加予定にある物は以下のとおりです:

- メニュー項目を追加するプラグイン

(しかし私はまだやっていません)。

FontForge は、プラグインの読み込み時にルーチン `int FontForgeInit(void)` を呼び出します。このルーチンは責任を持って FontForge のプラグインを登録し、それから FontForge の実行を続けるために呼び出し元に帰ります。FontForge は 2 つの登録ルーチンを提供します。

`AddEncoding(char *name,int (*enc_to_uni)(int), int (*uni_to_enc)(int))`
  この関数は、name で指定した名前をもつ新しい符号化方式を登録します。そのためには、ローカルな文字符号から Unicode へ変換する関数と Unicode から文字符号に変換する別の関数との 2 つの関数を提供する必要があります。注意: FontForge は文字符号の扱いが通常の方式とは異なります。バイトストリームを処理するのではなく、数値を対象にします。ですから (EUC や SJIS などの) 8/16 ビット符号化方式を扱う時は、文字の符号値は 0 から 65535 の範囲の値になります。1 バイト文字は 256 未満の数値であり、2 バイト文字は 0xa1a1 のような数値となるでしょう。

  この関数は失敗したとき (例えば、組込みの符号化方式を書き換えようとした場合) 0 を返し、指定された符号化方式を追加したときには 1 を、前に呼び出されたプラグインが登録した同名の符号化方式を書き換えたときには 2 を返します。

`AddScriptingCommand(char *name, void (*UserScriptFunc)(Context *), int needs_font)`
  この関数は、name で指定した名前をもつ新しいスクリプトコマンドを登録します。その名前が呼び出されたとき、UserScriptFunc で指定した関数を、引数 Context にその時のコンテキスト (渡された引数、カレントフォントおよび返り値 (があれば) をセットする場所などが含まれています) を代入して呼び出します。最後の引数は、フォントが読み込まれている必要があるか無いかを指定します。(コマンド Open() はフォントが読み込まれていなくても構いませんが、コマンド Close() はフォントが必要です)。

  この関数は失敗したとき (例えば、組込みのスクリプト関数を再定義しようとした場合) 0 を返し、指定されたコマンドを追加したときには 1 を、前に呼び出されたプラグインが登録した同名のコマンドを書き換えたときには 2 を返します。

`FontForgeInit` の中で 2 個以上の物を登録することができます。例えば、多くの符号化方式は EUC 形と ISO-2022 形をもっているので、1 個のプラグインが両方を取り扱うことには意味があります。

`FontForgeInit` は成功時には 1 を返し、失敗時には 0 を返します。失敗した場合には、FontForge は dlclose() を呼び出してライブラリを削除します。

プラグインを書く時には、fontforge ディレクトリにある“plugins.h”を呼び出すべきです。

どのようにしてプラグインを作成し、ビルドしてインストールするかについては、plugins サブディレクトリの例を参照してください。